package com.lanyou.esb.repository;

import java.util.List;

import org.apache.shiro.authz.annotation.Logical;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.Repository;
import org.springframework.data.repository.query.Param;
import org.springframework.data.rest.core.annotation.RestResource;
import com.lanyou.esb.entity.Ftp;
/**
 * 
 * @author ly-zengzugen
 *
 */
public interface FtpRepository extends Repository<Ftp, String>, JpaSpecificationExecutor<Ftp> {

	@RestResource(exported = false)
	Ftp findByInterfacecodeAndVersionAndIsEnable(@Param("interfacecode") String interfacecode, @Param("version") String version, @Param("isEnable") String isEnable);
	
	
	@RestResource(exported = false)
	Ftp findByInterfacecodeAndIsEnable(@Param("interfacecode") String interfacecode, @Param("isEnable") String isEnable);
	long countByIsEnable(@Param("isEnable") String isEnable);
	
	@RestResource(exported = false)
	long countByInterfaceNameAndIsEnable(@Param("interfaceName") String name, @Param("isEnable") String isEnable);
	
	@RestResource(exported = false)
	long countByInterfacecodeAndIsEnable(@Param("interfacecode") String code, @Param("isEnable") String isEnable);
	
	long count();

	boolean exists(String id);

	@RestResource(exported = true)
	@RequiresPermissions(value={"businessServiceManagement:maintain"})
	<S extends Ftp> S save(S entity); // could expose REST API

	<S extends Ftp> List<S> save(Iterable<S> entities);

	@RestResource(exported = true)
	@RequiresPermissions(value={"businessServiceManagement:view", "businessServiceManagement:maintain"}, logical = Logical.OR)
	Ftp findOne(String id); // could expose REST API

	Ftp getOne(String id);

	// 以下三个接口只能选一个暴露为REST API

	@RestResource(exported = false)
	List<Ftp> findAll(); // could expose REST API

	@RestResource(exported = false)
	List<Ftp> findAll(Sort sort); // could expose REST API

	@RestResource(exported = true)
	@RequiresPermissions(value={"businessServiceManagement:view", "businessServiceManagement:maintain"}, logical = Logical.OR)
	Page<Ftp> findAll(Pageable pageable); // could expose REST API

	List<Ftp> findAll(Iterable<String> ids);

	// 以下两个接口，要么都暴露为REST API，要么都不暴露
	@RestResource(exported = true)
	@RequiresPermissions(value={"businessServiceManagement:maintain"})
	void delete(String id); // could expose REST API

	@RestResource(exported = true)
	@RequiresPermissions(value={"businessServiceManagement:maintain"})
	void delete(Ftp entity); // could expose REST API

	void delete(Iterable<? extends Ftp> entities);

	void deleteAll();

	void flush();

	<S extends Ftp> S saveAndFlush(S entity);

	void deleteInBatch(Iterable<Ftp> entities);

	void deleteAllInBatch();

}
